home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / font.c < prev    next >
C/C++ Source or Header  |  2004-03-06  |  3KB  |  115 lines

  1. /*-------------------------------------------------------------
  2.   font.c : create font handle
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10.  
  11. /* Globas */
  12.  
  13. HFONT CreateMyFont(const char *fontname, int size,
  14.     LONG weight, LONG italic, int codepage);
  15.  
  16. /* Statics */
  17.  
  18. static struct {
  19.     int cp;
  20.     BYTE charset;
  21. } m_codepage_charset[] = {
  22.     { 932,  SHIFTJIS_CHARSET },
  23.     { 936,  GB2312_CHARSET },
  24.     { 949,  HANGEUL_CHARSET },
  25.     { 950,  CHINESEBIG5_CHARSET },
  26.     { 1250, EASTEUROPE_CHARSET },
  27.     { 1251, RUSSIAN_CHARSET },
  28.     { 1252, ANSI_CHARSET },
  29.     { 1253, GREEK_CHARSET },
  30.     { 1254, TURKISH_CHARSET },
  31.     { 1257, BALTIC_CHARSET },
  32.     { 0, 0}
  33. };
  34.  
  35. static BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  36.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM fontname);
  37.  
  38. /*------------------------------------------------
  39.    create a font of the clock
  40. --------------------------------------------------*/
  41. HFONT CreateMyFont(const char *fontname, int size,
  42.     LONG weight, LONG italic, int codepage)
  43. {
  44.     LOGFONT lf;
  45.     POINT pt;
  46.     HDC hdc;
  47.     BYTE charset;
  48.     int i;
  49.     
  50.     memset(&lf, 0, sizeof(LOGFONT));
  51.     
  52.     charset = 0;
  53.     for(i = 0; m_codepage_charset[i].cp; i++)
  54.     {
  55.         if(codepage == m_codepage_charset[i].cp)
  56.         {
  57.             charset = m_codepage_charset[i].charset; break;
  58.         }
  59.     }
  60.     
  61.     hdc = GetDC(NULL);
  62.     
  63.     // find a font named "fontname"
  64.     if(charset == 0)
  65.         charset = (BYTE)GetTextCharset(hdc);
  66.     
  67.     lf.lfCharSet = charset;
  68.     if(EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontFamExProc,
  69.         (LPARAM)fontname, 0))
  70.     {
  71.         lf.lfCharSet = OEM_CHARSET;
  72.         if(EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontFamExProc,
  73.             (LPARAM)fontname, 0))
  74.         {
  75.             lf.lfCharSet = ANSI_CHARSET;
  76.             EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontFamExProc,
  77.                 (LPARAM)fontname, 0);
  78.         }
  79.     }
  80.     
  81.     pt.x = 0;
  82.     pt.y = GetDeviceCaps(hdc, LOGPIXELSY) * size / 72;
  83.     DPtoLP(hdc, &pt, 1);
  84.     lf.lfHeight = -pt.y;
  85.     
  86.     ReleaseDC(NULL, hdc);
  87.     
  88.     lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;
  89.     lf.lfWeight = weight;
  90.     lf.lfItalic = (BYTE)italic;
  91.     lf.lfUnderline = 0;
  92.     lf.lfStrikeOut = 0;
  93.     //lf.lfCharSet = ;
  94.     lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
  95.     lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  96.     lf.lfQuality = DEFAULT_QUALITY;
  97.     lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
  98.     strcpy(lf.lfFaceName, fontname);
  99.     
  100.     return CreateFontIndirect(&lf);
  101. }
  102.  
  103. /*------------------------------------------------
  104.    callback function for EnumFontFamiliesEx,
  105.    to find a designated font
  106. --------------------------------------------------*/
  107. BOOL CALLBACK EnumFontFamExProc(ENUMLOGFONTEX* pelf, 
  108.     NEWTEXTMETRICEX* lpntm, int FontType, LPARAM fontname)
  109. {
  110.     if(strcmp((LPSTR)fontname, pelf->elfLogFont.lfFaceName) == 0)
  111.         return FALSE;
  112.     return TRUE;
  113. }
  114.  
  115.